To Do List
- ADD a first half second half indicator - done, see field
period_half.
- Code that runs.
- Get github up and running
Data
The object sessDat has data from all 6 sessions.
- There are 120 subjects
- Each subject participated in 15 rounds.
- Each round had 20 subperiods. The data lists 22 subperiods.
- Subperiod
0 is the settings player.loc and player.price the subject was initialized at.
- Subperiod
21 is the player.price the subject would be at if the period continued.
Variables in sessDat
session.code
participant.code is a unique subject identifyer.
player.period_number
player.subperiod_number
period_half either “First Half” or “Second Half”. NA if period 0 or 21.
player.loc location
player.price price
player.boundary_lo and player.boundary_hi are the high and low boundary for this player currently
group_size number of players in the group
group_size_str a string for the group size
player.transport_cost shopping cost, 0.10, 0.25, 0.40, 0.60
player.mc mill cost, 0.05, 0.15, 0.25
player.rp reserve price, 0.8, 0.9, 1.0
score_subperiod this player’s current score
score_total currency period’s total score for this player.
Summary Statistics
Summary of sessions and subjects.
Sessions were run at the New York University Abu Dhabi and the United Arab Emirates with undergraduate students between Oct 17 and Oct 19th, 2017.
Subjects earned on average $84.25 from the experiment. After a 30 AED show-up fee and rounding up to the 5 AED, subjects walked away on average with $114.25
The experiment was conducted with oTree (Citation: Chen, D.L., Schonger, M., Wickens, C., 2016. oTree - An open-source platform for laboratory, online and field experiments. Journal of Behavioral and Experimental Finance, vol 9: 88-97) subjects were recruited with hroot (Citation: Bock, Olaf, Ingmar Baetge & Andreas Nicklisch (2014). hroot – Hamburg registration and organization online tool. European Economic Review 71, 117-120)
Hypothesis 1 - competitiveness and mark-ups
Hypothesis 1. Static mark-ups will be lower in more competitive (higher N) markets.
In the plot below,
- Each dot is the average price per subject in one period-half (20 subperiods, two halfs) with fixed shopping costs and player count.
- Violins are similarly based on average player-period prices.
- The line is the average price for that player-number period-half combination,
- Ribben is the confidence interval, one se plus or minus.
| Four Player |
3 |
72 |
15 |
| Two Player |
3 |
48 |
15 |
In the pilot we had a spread of transport costs from 0.1 to 1.0. Between 0.1 and 0.5 there wasn’t a huge difference in price, only at 0.75 and 1.0 did we see a substantial increase in markups. In this design we only had a spread of transport costs between 0.1 and 0.6, and we don’t see a consistent increase in price as transport costs increase.
In the plot below,
- each dot is the average price per subject in one period (20 subperiods) with fixed shopping costs and player count.
- violins are based on average player-period prices.
- the line is the average price for that player-number, shopping cost comvination,
- ribben is the confidence interval, one se plus or minus.
- A very similar plot appears when looking at all prices over all subperiods.



Comparing prices in both treatments. - We see with greater competition there are lower prices accross all shopping costs.

Now, looking just at the later half of each period, subperiods 11 to 20, (remove from final)
| Four Player |
0.31 (±0.0123) |
0.23 (±0.0176) |
0.28 (±0.0117) |
0.31 (±0.024) |
| Two Player |
0.55 (±0.0263) |
0.41 (±0.039) |
0.5 (±0.0255) |
0.44 (±0.0419) |
Strong evidence for Hypothesis 1.
Looking at the average prices within a period (all 20 subperiods) with the same player number and transport cost, there is a statistically significant difference between prices at each transport level between player number treatments.
Even comparing t = 6.0 in the four player game – the transport cost in which the four-player game with highest prices – to t = 0.25 in the two player game – in which prices were the lowest in the two-player game – the two player game has statistically significantly higher prices (p-value < 0.001).
| Four Player |
0.31 (±0.0123) |
0.23 (±0.0176) |
0.28 (±0.0117) |
0.31 (±0.024) |
| Two Player |
0.55 (±0.0263) |
0.41 (±0.039) |
0.5 (±0.0255) |
0.44 (±0.0419) |
Hypothesis 2 - shipping costs and mark-ups
Hypothesis 2 - There is a positive relationship between shopping costs and mark-ups.
Looking at the two-player game
Welch Two Sample t-test
data: player.price[(playerNum == "Two Player" & player.transport_cost == and player.price[(playerNum == "Four Player" & player.transport_cost == 0.25)] and 0.6)]
t = 5.5709, df = 176.38, p-value = 9.331e-08
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.06173099 0.12946116
sample estimates:
mean of x mean of y
0.4129291 0.3173331
Wilcoxon rank sum test with continuity correction
data: player.price[(playerNum == "Two Player" & player.transport_cost == and player.price[(playerNum == "Four Player" & player.transport_cost == 0.25)] and 0.6)]
W = 12880, p-value = 1.696e-07
alternative hypothesis: true location shift is not equal to 0


Recall there were 72 subjects in the four-player treatment and 48 subjects in the two-player treatment.
Initial Look at Two-Player Game
First, within the two player game, comparing prices in t = 0.1 and t = 0.6 (see below), there is to be a statistically significant difference.
There is a relationship between prices and shopping cost treatments. In higher shopping cost settings subjects tended to have higher prices.
- Unit of observation is an individual’s average price within a period, at a set shopping cost level.
- A t test comparing prices between min and max shopping costs. Prices are average price at the session, participant, and period level. P-value 2.867e-11
- A MW rank sum test comparing prices between min and max shopping costs. Prices are average price at the session, participant, and period level. P-value 1.12e-09
| Four Player |
0.10 |
648 |
0.312 |
0.303 |
0.005 |
| Four Player |
0.25 |
168 |
0.229 |
0.195 |
0.009 |
| Four Player |
0.40 |
576 |
0.280 |
0.260 |
0.004 |
| Four Player |
0.60 |
168 |
0.311 |
0.299 |
0.008 |
| Two Player |
0.10 |
432 |
0.547 |
0.523 |
0.008 |
| Two Player |
0.25 |
112 |
0.412 |
0.404 |
0.015 |
| Two Player |
0.40 |
384 |
0.500 |
0.482 |
0.008 |
| Two Player |
0.60 |
112 |
0.443 |
0.436 |
0.012 |
Initial Look at Four-Player Game
In the four-player game the relationship, at least between the lowest and highest shopping cost, does not appear stronger.
- A t test comparing prices between min and max shopping costs. Prices are average price at the session, participant, and period level. P-value 0.9459.
- A MW rank sum test comparing prices between min and max shopping costs. Prices are average price at the session, participant, and period level. P-value = 0.8919
Welch Two Sample t-test
data: mean_price[player.transport_cost == 0.1] and mean_price[player.transport_cost == 0.6]
t = 7.0137, df = 218.42, p-value = 2.867e-11
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.0748557 0.1333672
sample estimates:
mean of x mean of y
0.5472454 0.4431339
Wilcoxon rank sum test with continuity correction
data: mean_price[player.transport_cost == 0.1] and mean_price[player.transport_cost == 0.6]
W = 33222, p-value = 1.12e-09
alternative hypothesis: true location shift is not equal to 0
Model
Only looking at the first half of periods
Welch Two Sample t-test
data: mean_price[player.transport_cost == 0.1] and mean_price[player.transport_cost == 0.6]
t = 0.06797, df = 310.47, p-value = 0.9459
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.01850285 0.01982693
sample estimates:
mean of x mean of y
0.3118495 0.3111875
Wilcoxon rank sum test with continuity correction
data: mean_price[player.transport_cost == 0.1] and mean_price[player.transport_cost == 0.6]
W = 54802, p-value = 0.8919
alternative hypothesis: true location shift is not equal to 0
Here we have a log-log model regressing prices on shopping costs, with player-number fixed effects.
\(ln(P_{ip}) = \beta_0 + \beta_1 \delta_{i} + \beta_2 ln(S_{ip}) + \beta_3 Period_p + \epsilon_{(ip)}\)

- Where \(P_{ip}\) is the average price for for this participant in this period, the average of 20 sub-periods.
- \(\delta_{i}\) is an indicator equal to 1 if individual \(i\) participated in the two-player treatment.
- \(S_ip\) is the shopping cost this individual faced in this period.
- where \(Period_p\) is the period number. Period fixed effects.
In this specification, the coefficient \(\beta_2\) measures the average effect of being assigned to the less competitive two-player treatment group. With \(\beta_2 = -0.056040\), a 1% increase in shopping costs leads to a -5.6% decrease in prices. This is significant.
Hypothesis 3 - mark-up responsiveness to competition
Hypothesis 3. Mark-ups will be less responsive to changes in shopping costs in less competitive (lower N) markets.
\(ln(Price_{(i,p)}) = \beta_0 + \beta_1 \delta_{2p} + \beta_2 ln(ShoppingCost) + \beta_3 \delta_{i} ln(ShoppingCost) + \epsilon_{(i,p)}\)
Call:
lm(formula = log(price) ~ playerNum + log(player.transport_cost) +
player.period_number, data = df %>% mutate(price = price +
0.01))
Residuals:
Min 1Q Median 3Q Max
-1.66267 -0.22208 0.01354 0.24857 1.05850
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.272706 0.025519 -49.873 < 2e-16 ***
playerNumTwo Player 0.540056 0.017600 30.685 < 2e-16 ***
log(player.transport_cost) -0.074936 0.012182 -6.151 9.45e-10 ***
player.period_number -0.003878 0.002013 -1.926 0.0542 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.3658 on 1796 degrees of freedom
Multiple R-squared: 0.3532, Adjusted R-squared: 0.3521
F-statistic: 326.9 on 3 and 1796 DF, p-value: < 2.2e-16
The coefficient \(\beta_2\) estimates that a 1% increase in shopping costs will leave to a 3.4% decrease in prices in the four-player game. The \(\beta_3\) coefficient indicates a one unit increase in shopping cost leads to a 5.9% decrease in prices in the two-player game relative to the 4-player game“.
Call:
lm(formula = log(price) ~ playerNum + log(player.transport_cost) +
playerNum:log(player.transport_cost), data = df %>% mutate(price = price +
0.01))
Residuals:
Min 1Q Median 3Q Max
-1.68752 -0.22339 0.01848 0.25154 1.05189
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.26325 0.02628 -48.071 < 2e-16 ***
playerNumTwo Player 0.45058 0.04155 10.844 < 2e-16 ***
log(player.transport_cost) -0.04844 0.01558 -3.108 0.00191 **
playerNumTwo Player:log(player.transport_cost) -0.05857 0.02464 -2.377 0.01756 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.3656 on 1796 degrees of freedom
Multiple R-squared: 0.3539, Adjusted R-squared: 0.3528
F-statistic: 327.9 on 3 and 1796 DF, p-value: < 2.2e-16
| \(\delta_{i}\) (two-player) |
0.559101 |
*** |
0.45058 |
*** |
|
(0.015870) |
|
(0.04155) |
|
| \(ln(ShoppingCost)\) |
-0.056040 |
*** |
-0.04844 |
*** |
|
(0.011023) |
|
(0.01558) |
|
| \(\delta_{i} \cdot ln(ShoppingCost)\) |
|
|
-0.05857 |
* |
|
|
|
(0.02464) |
|
|
|
|
|
|
| ————————————— |
—— |
— |
—— |
— |
| N |
552 |
|
552 |
|
LS0tCnRpdGxlOiAiT24gdGhlIGR5bmFtaWNzIG9mIG1hcmstdXBzLCByZXN1bHRzIHNlY3Rpb24iCmF1dGhvcjogCi0gIkN1cnRpcyBLZXBoYXJ0IgotICJEYXZpZCBNdW5ybyIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICAgIGZpZ19oZWlnaHQ6IDQKICAgIGZpZ193aWR0aDogNwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgoKVG8gRG8gTGlzdAoKLSBBREQgIGEgZmlyc3QgaGFsZiBzZWNvbmQgaGFsZiBpbmRpY2F0b3IgLSBkb25lLCBzZWUgZmllbGQgYHBlcmlvZF9oYWxmYC4KLSBDb2RlIHRoYXQgcnVucy4gCi0gR2V0IGdpdGh1YiB1cCBhbmQgcnVubmluZwoKCmBgYHtyIHV0aWwsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGU9VFJVRSApIAojbWFrZSBzdXJlIHlvdSBzZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS4gCgpgYGAKIAoKYGBge3IsIHNldHVwLCBlY2hvPUZBTFNFLCBlcnJvcj1GQUxTRSwgIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoZ2x1ZSkKCnNvdXJjZSgiLi4vci9ldGwuUiIpCgpzZXNzRGF0ID0gc2Vzc0RhdCAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBncm91cF9ieShwYXJ0aWNpcGFudC5jb2RlLCBwbGF5ZXIucGVyaW9kX251bWJlcikgJT4lIAogIG11dGF0ZSgKICAgIHBsYXllck51bSA9IGdyb3VwX3NpemVfc3RyLAogICAgc2NvcmVfc3VicGVyaW9kID0gbGVhZChwbGF5ZXIucHJldl9yb3VuZF9wYXlvZmYpLAogICAgc2NvcmVfdG90YWwgPSBsZWFkKHBsYXllci5wcmV2X3JvdW5kX2N1bXVsYXRpdmVfcGF5b2ZmKQogICkKCmBgYAoKCiMgRGF0YQoKVGhlIG9iamVjdCBgc2Vzc0RhdGAgaGFzIGRhdGEgZnJvbSBhbGwgNiBzZXNzaW9ucy4gCgotIFRoZXJlIGFyZSBgciBzZXNzRGF0JHBhcnRpY2lwYW50LmNvZGUgJT4lIHVuaXF1ZSgpICU+JSBsZW5ndGhgIHN1YmplY3RzCi0gRWFjaCBzdWJqZWN0IHBhcnRpY2lwYXRlZCBpbiAxNSByb3VuZHMuIAotIEVhY2ggcm91bmQgaGFkIDIwIHN1YnBlcmlvZHMuIFRoZSBkYXRhIGxpc3RzIDIyIHN1YnBlcmlvZHMuIAogLSBTdWJwZXJpb2QgYDBgIGlzIHRoZSBzZXR0aW5ncyBgcGxheWVyLmxvY2AgYW5kIGBwbGF5ZXIucHJpY2VgIHRoZSBzdWJqZWN0IHdhcyBpbml0aWFsaXplZCBhdC4gCiAtIFN1YnBlcmlvZCBgMjFgIGlzIHRoZSBgcGxheWVyLnByaWNlYCB0aGUgc3ViamVjdCB3b3VsZCBiZSBhdCBpZiB0aGUgcGVyaW9kIGNvbnRpbnVlZC4gCgpWYXJpYWJsZXMgaW4gYHNlc3NEYXRgCgotIGBzZXNzaW9uLmNvZGVgCi0gYHBhcnRpY2lwYW50LmNvZGVgIGlzIGEgdW5pcXVlIHN1YmplY3QgaWRlbnRpZnllci4KLSBgcGxheWVyLnBlcmlvZF9udW1iZXJgCi0gYHBsYXllci5zdWJwZXJpb2RfbnVtYmVyYAotIGBwZXJpb2RfaGFsZmAgZWl0aGVyICJGaXJzdCBIYWxmIiBvciAiU2Vjb25kIEhhbGYiLiBgTkFgIGlmIHBlcmlvZCAwIG9yIDIxLiAgCi0gYHBsYXllci5sb2NgICBsb2NhdGlvbgotIGBwbGF5ZXIucHJpY2VgIHByaWNlCi0gYHBsYXllci5ib3VuZGFyeV9sb2AgYW5kIGBwbGF5ZXIuYm91bmRhcnlfaGlgIGFyZSB0aGUgaGlnaCBhbmQgbG93IGJvdW5kYXJ5IGZvciB0aGlzIHBsYXllciBjdXJyZW50bHkKLSBgZ3JvdXBfc2l6ZWAgbnVtYmVyIG9mIHBsYXllcnMgaW4gdGhlIGdyb3VwCi0gYGdyb3VwX3NpemVfc3RyYCBhIHN0cmluZyBmb3IgdGhlIGdyb3VwIHNpemUKLSBgcGxheWVyLnRyYW5zcG9ydF9jb3N0YCBzaG9wcGluZyBjb3N0LCBgMC4xMCwgMC4yNSwgMC40MCwgMC42MGAKLSBgcGxheWVyLm1jYCBtaWxsIGNvc3QsIGAwLjA1LCAwLjE1LCAwLjI1YAotIGBwbGF5ZXIucnBgIHJlc2VydmUgcHJpY2UsIGAwLjgsIDAuOSwgMS4wYAotIGBzY29yZV9zdWJwZXJpb2RgIHRoaXMgcGxheWVyJ3MgY3VycmVudCBzY29yZQotIGBzY29yZV90b3RhbGAgY3VycmVuY3kgcGVyaW9kJ3MgdG90YWwgc2NvcmUgZm9yIHRoaXMgcGxheWVyLiAKCgojIFN1bW1hcnkgU3RhdGlzdGljcwoKU3VtbWFyeSBvZiBzZXNzaW9ucyBhbmQgc3ViamVjdHMuCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsICBjYWNoZT1GQUxTRX0KCgpzZXNzRGF0ICU+JQogIGdyb3VwX2J5KGdyb3VwX3NpemVfc3RyKSAlPiUKICBzdW1tYXJpc2UoCiAgICBTZXNzaW9ucyA9IHNlc3Npb24uY29kZSAlPiUgdW5pcXVlICU+JSBsZW5ndGgsCiAgICBTdWJqZWN0cyA9IHBhcnRpY2lwYW50LmNvZGUgJT4lIHVuaXF1ZSAlPiUgbGVuZ3RoLAogICAgUGVyaW9kcyAgPSBwbGF5ZXIucGVyaW9kX251bWJlciAlPiUgdW5pcXVlICU+JSBsZW5ndGggCiAgKSAlPiUKICBrYWJsZSgKICAgIGZvcm1hdCA9ICJtYXJrZG93biIsCiAgICBhbGlnbiA9IGMoImwiLCJjIiwiYyIsImMiKSwKICAgIGNvbC5uYW1lcyA9IGMoIk51bWJlciBvZiBQbGF5ZXJzIiwgIlNlc3Npb25zIiwgIlN1YmplY3RzIiwgIlBlcmlvZHMgUGVyIFNlc3Npb24iKQogICkKCmBgYAoKClNlc3Npb25zIHdlcmUgcnVuIGF0IHRoZSBOZXcgWW9yayBVbml2ZXJzaXR5IEFidSBEaGFiaSBhbmQgdGhlIFVuaXRlZCBBcmFiIEVtaXJhdGVzIHdpdGggdW5kZXJncmFkdWF0ZSBzdHVkZW50cyBiZXR3ZWVuIE9jdCAxNyBhbmQgT2N0IDE5dGgsIDIwMTcuIAoKU3ViamVjdHMgZWFybmVkIG9uIGF2ZXJhZ2UgXCRgciAtMzAgKyAoU3NQYXkgJT4lIGZpbHRlcighKFBheW1lbnQgJWluJSBjKDAsMzApKSkpJFBheW1lbnQgJT4lIG1lYW4gJT4lIHJvdW5kKDIpYCBmcm9tIHRoZSBleHBlcmltZW50LiBBZnRlciBhIDMwIEFFRCBzaG93LXVwIGZlZSBhbmQgcm91bmRpbmcgdXAgdG8gdGhlIDUgQUVELCBzdWJqZWN0cyB3YWxrZWQgYXdheSBvbiBhdmVyYWdlIHdpdGggXCRgciAoU3NQYXkgJT4lIGZpbHRlcighKFBheW1lbnQgJWluJSBjKDAsMzApKSkpJFBheW1lbnQgJT4lIG1lYW4gJT4lIHJvdW5kKDIpYAoKVGhlIGV4cGVyaW1lbnQgd2FzIGNvbmR1Y3RlZCB3aXRoIG9UcmVlICgqQ2l0YXRpb246IENoZW4sIEQuTC4sIFNjaG9uZ2VyLCBNLiwgV2lja2VucywgQy4sIDIwMTYuIG9UcmVlIC0gQW4gb3Blbi1zb3VyY2UgcGxhdGZvcm0gZm9yIGxhYm9yYXRvcnksIG9ubGluZSBhbmQgZmllbGQgZXhwZXJpbWVudHMuIEpvdXJuYWwgb2YgQmVoYXZpb3JhbCBhbmQgRXhwZXJpbWVudGFsIEZpbmFuY2UsIHZvbCA5OiA4OC05NyopIHN1YmplY3RzIHdlcmUgcmVjcnVpdGVkIHdpdGggaHJvb3QgKCpDaXRhdGlvbjogQm9jaywgT2xhZiwgSW5nbWFyIEJhZXRnZSAmIEFuZHJlYXMgTmlja2xpc2NoICgyMDE0KS4gaHJvb3Qg4oCTIEhhbWJ1cmcgcmVnaXN0cmF0aW9uIGFuZCBvcmdhbml6YXRpb24gb25saW5lIHRvb2wuIEV1cm9wZWFuIEVjb25vbWljIFJldmlldyA3MSwgMTE3LTEyMCopCgoKCgojIEh5cG90aGVzaXMgMSAtIGNvbXBldGl0aXZlbmVzcyBhbmQgbWFyay11cHMKCioqSHlwb3RoZXNpcyAxKiouICpTdGF0aWMgbWFyay11cHMgd2lsbCBiZSBsb3dlciBpbiBtb3JlIGNvbXBldGl0aXZlIChoaWdoZXIgTikgbWFya2V0cy4qCgpJbiB0aGUgcGxvdCBiZWxvdywgCgotIEVhY2ggZG90IGlzIHRoZSBhdmVyYWdlIHByaWNlIHBlciBzdWJqZWN0IGluIG9uZSBwZXJpb2QtaGFsZiAoMjAgc3VicGVyaW9kcywgdHdvIGhhbGZzKSB3aXRoIGZpeGVkIHNob3BwaW5nIGNvc3RzIGFuZCBwbGF5ZXIgY291bnQuIAotIFZpb2xpbnMgYXJlIHNpbWlsYXJseSBiYXNlZCBvbiBhdmVyYWdlIHBsYXllci1wZXJpb2QgcHJpY2VzLiAKLSBUaGUgbGluZSBpcyB0aGUgYXZlcmFnZSBwcmljZSBmb3IgdGhhdCBwbGF5ZXItbnVtYmVyIHBlcmlvZC1oYWxmIGNvbWJpbmF0aW9uLCAKLSBSaWJiZW4gaXMgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwsIG9uZSBzZSBwbHVzIG9yIG1pbnVzLiAKCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsICBjYWNoZT1GQUxTRX0KYXZnX3Blcl9wcmljZXMgPC0gZnVuY3Rpb24oCiAgZGF0YSA9IHNlc3NEYXQsCiAgcnAgPSBOVUxMCil7CiAgZGYgPSBzZXNzRGF0ICU+JQogIGZpbHRlcigKICAgICFpcy5uYShwZXJpb2RfaGFsZikKICAgICYgcGxheWVyLnJwID09IHJwCiAgKQoKZGYyID0gZGYgJT4lCiAgZ3JvdXBfYnkoZ3JvdXBfc2l6ZV9zdHIsIHBsYXllci50cmFuc3BvcnRfY29zdCwgcGxheWVyLnBlcmlvZF9udW1iZXIsIHBhcnRpY2lwYW50LmNvZGUscGVyaW9kX2hhbGYsIHBsYXllci5tYykgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIFByaWNlID0gbWVhbihwbGF5ZXIucHJpY2UpLAogICAgUHJpY2VfTWVkaWFuID0gbWVkaWFuKHBsYXllci5wcmljZSksCiAgICBwcmljZV9zZV9VcDEgPSBQcmljZSArIHNlKHBsYXllci5wcmljZSksCiAgICBwcmljZV9zZV9Ed24xID0gUHJpY2UgLSBzZShwbGF5ZXIucHJpY2UpCiAgKQoKcDEgPSBkZiAlPiUKICBnZ3Bsb3QoCiAgKSArCiAgZmFjZXRfZ3JpZChncm91cF9zaXplX3N0ciB+IHBlcmlvZF9oYWxmKSArCiAgZ2VvbV92aW9saW4oCiAgICBhZXMoeSA9IHBsYXllci5wcmljZSwKICAgICAgICB4ID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0LAogICAgICAgIGdyb3VwID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0KSwKICAgIGFscGhhID0gMC4zLAogICAgY29sb3IgPSAiZ3JleTcwIgogICkgKwogIGdlb21fcmliYm9uKAogICAgZGF0YSA9IGRmMiAlPiUgCiAgICAgIGdyb3VwX2J5KGdyb3VwX3NpemVfc3RyLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsIHBsYXllci5tYywgcGVyaW9kX2hhbGYpICU+JQogICAgICBzdW1tYXJpc2UoCiAgICAgICAgbWVhbl9wcmljZSA9IG1lYW4oUHJpY2UpLAogICAgICAgIHByaWNlX3NlX1VwMSA9IG1lYW5fcHJpY2UgKyBzZShQcmljZSksCiAgICAgICAgcHJpY2Vfc2VfRHduMSA9IG1lYW5fcHJpY2UgLSBzZShQcmljZSkKICAgICAgKSwgCiAgICBhZXMoCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgIHltYXggPSBwcmljZV9zZV9VcDEsCiAgICAgIHltaW4gPSBwcmljZV9zZV9Ed24xLAogICAgICBncm91cCA9IHBsYXllci5tYywKICAgICAgZmlsbCA9IHBsYXllci5tYwogICAgICAKICAgICksCiAgICBhbHBoYSA9IC4yCiAgKSArCiAgZ2VvbV9saW5lKAogICAgZGF0YSA9IGRmMiAlPiUgCiAgICAgIGdyb3VwX2J5KGdyb3VwX3NpemVfc3RyLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsIHBsYXllci5tYywgcGVyaW9kX2hhbGYpICU+JQogICAgICBzdW1tYXJpc2UoCiAgICAgICAgbWVhbl9wcmljZSA9IG1lYW4oUHJpY2UpCiAgICAgICkgICwgCiAgICBhZXMoCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgIHkgPSBtZWFuX3ByaWNlLAogICAgICBncm91cCA9IHBsYXllci5tYywKICAgICAgY29sb3IgPSBwbGF5ZXIubWMKICAgICkKICApICsKICBnZW9tX2ppdHRlcigKICAgIGFlcygKICAgICAgeSA9IFByaWNlLAogICAgICB4ID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0CiAgICApLAogICAgCiAgICBkYXRhID0gZGYyLAogICAgd2lkdGggPSAwLjAyLAogICAgaGVpZ2h0ID0gMCwKICAgIGFscGhhID0gMC4yKSArIAogIHNjYWxlX3hfY29udGludW91cygKICAgIGJyZWFrcyA9IGMoMC4xLCAwLjI1LCAwLjQsIDAuNikKICApICsKICB0aGVtZV9idygpICsKICBsYWJzKAogICAgeCA9ICJTaG9wcGluZyBDb3N0IiwKICAgIHkgPSAiUHJpY2UiLAogICAgdGl0bGUgPSBnbHVlKCJBdmVyYWdlIFBlcmlvZCBQcmljZXMsIFJQOiB7cnB9IikKICApCgpyZXR1cm4ocDEpCiAgCn0KCmF2Z19wZXJfcHJpY2VzKHJwID0gMS4wKQphdmdfcGVyX3ByaWNlcyhycCA9IDAuOSkKYXZnX3Blcl9wcmljZXMocnAgPSAwLjgpCgoKCmBgYAoKSW4gdGhlIHBpbG90IHdlIGhhZCBhIHNwcmVhZCBvZiB0cmFuc3BvcnQgY29zdHMgZnJvbSAwLjEgdG8gMS4wLiBCZXR3ZWVuIDAuMSBhbmQgMC41IHRoZXJlIHdhc24ndCBhIGh1Z2UgZGlmZmVyZW5jZSBpbiBwcmljZSwgb25seSBhdCAwLjc1IGFuZCAxLjAgZGlkIHdlIHNlZSBhIHN1YnN0YW50aWFsIGluY3JlYXNlIGluIG1hcmt1cHMuIEluIHRoaXMgZGVzaWduIHdlIG9ubHkgaGFkIGEgc3ByZWFkIG9mIHRyYW5zcG9ydCBjb3N0cyBiZXR3ZWVuIDAuMSBhbmQgMC42LCBhbmQgd2UgZG9uJ3Qgc2VlIGEgY29uc2lzdGVudCBpbmNyZWFzZSBpbiBwcmljZSBhcyB0cmFuc3BvcnQgY29zdHMgaW5jcmVhc2UuIAoKLSBSUCAwLjkgaXMgaW50ZXJlc3RpbmcuIAoKLS0tLS0tLS0tCgpJbiB0aGUgcGxvdCBiZWxvdywgCgotIGVhY2ggZG90IGlzIHRoZSBhdmVyYWdlIHByaWNlIHBlciBzdWJqZWN0IGluIG9uZSBwZXJpb2QgKDIwIHN1YnBlcmlvZHMpIHdpdGggZml4ZWQgc2hvcHBpbmcgY29zdHMgYW5kIHBsYXllciBjb3VudC4gCi0gdmlvbGlucyBhcmUgYmFzZWQgb24gYXZlcmFnZSBwbGF5ZXItcGVyaW9kIHByaWNlcy4gCi0gdGhlIGxpbmUgaXMgdGhlIGF2ZXJhZ2UgcHJpY2UgZm9yIHRoYXQgcGxheWVyLW51bWJlciwgc2hvcHBpbmcgY29zdCBjb212aW5hdGlvbiwgCi0gcmliYmVuIGlzIHRoZSBjb25maWRlbmNlIGludGVydmFsLCBvbmUgc2UgcGx1cyBvciBtaW51cy4gCi0gQSB2ZXJ5IHNpbWlsYXIgcGxvdCBhcHBlYXJzIHdoZW4gbG9va2luZyBhdCBhbGwgcHJpY2VzIG92ZXIgYWxsIHN1YnBlcmlvZHMuIAoKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBlcnJvcj1GQUxTRSwgIGNhY2hlPUZBTFNFfQoKZGYyID0gc2Vzc0RhdCAlPiUKICBmaWx0ZXIoIWlzLm5hKHBlcmlvZF9oYWxmKSkgJT4lIAogIGdyb3VwX2J5KHBsYXllck51bSwgcGVyaW9kX2hhbGYsIHBsYXllci50cmFuc3BvcnRfY29zdCwgcGxheWVyLnBlcmlvZF9udW1iZXIsIHBhcnRpY2lwYW50LmNvZGUpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBQcmljZSA9IG1lYW4ocGxheWVyLnByaWNlKSwKICAgIFByaWNlX01lZGlhbiA9IG1lZGlhbihwbGF5ZXIucHJpY2UpLAogICAgcHJpY2Vfc2VfVXAxID0gUHJpY2UgKyBzZShwbGF5ZXIucHJpY2UpLAogICAgcHJpY2Vfc2VfRHduMSA9IFByaWNlIC0gc2UocGxheWVyLnByaWNlKQogICkKCgoKZ2dwbG90KAogIGRmMgopICsKICBmYWNldF9ncmlkKHBsYXllck51bSB+IHBlcmlvZF9oYWxmKSArCiAgZ2VvbV92aW9saW4oCiAgICBhZXMoeSA9IFByaWNlLAogICAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgICAgZ3JvdXAgPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpLAogICAgYWxwaGEgPSAwLjMsCiAgICBjb2xvciA9ICJncmV5NzAiCiAgKSArCiAgZ2VvbV9yaWJib24oCiAgICBkYXRhID0gZGYyICU+JSAKICAgICAgZ3JvdXBfYnkocGxheWVyTnVtLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICU+JQogICAgICBzdW1tYXJpc2UoCiAgICAgICAgbWVhbl9wcmljZSA9IG1lYW4oUHJpY2UpLAogICAgICAgIHByaWNlX3NlX1VwMSA9IG1lYW5fcHJpY2UgKyBzZShQcmljZSksCiAgICAgICAgcHJpY2Vfc2VfRHduMSA9IG1lYW5fcHJpY2UgLSBzZShQcmljZSkKICAgICAgKSwgCiAgICBhZXMoCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgIHltYXggPSBwcmljZV9zZV9VcDEsCiAgICAgIHltaW4gPSBwcmljZV9zZV9Ed24xCiAgICApLAogICAgYWxwaGEgPSAuMgogICkgKwogIGdlb21fbGluZSgKICAgIGRhdGEgPSBkZjIgJT4lIAogICAgICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCkgJT4lCiAgICAgIHN1bW1hcmlzZSgKICAgICAgICBtZWFuX3ByaWNlID0gbWVhbihQcmljZSkKICAgICAgKSAgLCAKICAgIGFlcygKICAgICAgeCA9IHBsYXllci50cmFuc3BvcnRfY29zdCwKICAgICAgeSA9IG1lYW5fcHJpY2UKICAgICkKICApICsKICBnZW9tX2ppdHRlcigKICAgIGFlcygKICAgICAgeSA9IFByaWNlLAogICAgICB4ID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0CiAgICApLAogICAgCiAgICBkYXRhID0gZGYyLAogICAgd2lkdGggPSAwLjAyLAogICAgaGVpZ2h0ID0gMCwKICAgIGFscGhhID0gMC4zKSArIAogIHNjYWxlX3hfY29udGludW91cygKICAgIGJyZWFrcyA9IGMoMC4xLCAwLjI1LCAwLjUsIDAuNzUsIDEuMCkKICApICsKICB0aGVtZV9idygpICsKICBsYWJzKAogICAgeCA9ICJTaG9wcGluZyBDb3N0IiwKICAgIHkgPSAiUHJpY2UiLAogICAgdGl0bGUgPSAiQXZlcmFnZSBQZXJpb2QgUHJpY2VzIgogICkKCgoKCgogIApgYGAKCgotLS0tLS0tLS0tCgpDb21wYXJpbmcgcHJpY2VzIGluIGJvdGggdHJlYXRtZW50cy4gCi0gV2Ugc2VlIHdpdGggZ3JlYXRlciBjb21wZXRpdGlvbiB0aGVyZSBhcmUgbG93ZXIgcHJpY2VzIGFjY3Jvc3MgYWxsIHNob3BwaW5nIGNvc3RzLiAKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBlcnJvcj1GQUxTRSwgIGNhY2hlPUZBTFNFfQoKCmRmMiA9IHNlc3NEYXQgJT4lICAKICBmaWx0ZXIoIWlzLm5hKHBlcmlvZF9oYWxmKSkgJT4lIAogIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0LCBwYXJ0aWNpcGFudC5jb2RlLCBwbGF5ZXIucGVyaW9kX251bWJlcikgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIHBsYXllci5wcmljZSA9IG1lYW4ocGxheWVyLnByaWNlKQogICkgJT4lCiAgZ3JvdXBfYnkocGxheWVyTnVtLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBQcmljZSA9IHBhc3RlKG1lYW4ocGxheWVyLnByaWNlKSAlPiUgcm91bmQoMiksICIgKMKxIiwgc2UocGxheWVyLnByaWNlKSAlPiUgcm91bmQoNCksICAiKSIsIHNlcD0iIikKICApCgprYWJsZSgKICBmb3JtYXQgPSAibWFya2Rvd24iLAogIGRmMiAlPiV0aWR5cjo6c3ByZWFkKAogICAgcGxheWVyLnRyYW5zcG9ydF9jb3N0LCBQcmljZQogICksCiAgYWxpZ24gPSBjKCJsIiwiYyIsImMiLCJjIiwiYyIsImMiKSwKICAjIGNvbC5uYW1lcyA9IGMoIiIsICJzID0gMC4xIiwicyA9IDAuMjUiLCJzID0gMC41IiwicyA9IDAuNzUiLCJzID0gMSIpLAogIGNhcHRpb24gPSAiYWRzZnNlIgopCgpgYGAKCk5vdywgbG9va2luZyBqdXN0IGF0IHRoZSBsYXRlciBoYWxmIG9mIGVhY2ggcGVyaW9kLCBzdWJwZXJpb2RzIDExIHRvIDIwLCAocmVtb3ZlIGZyb20gZmluYWwpCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsICBjYWNoZT1GQUxTRX0KCmRmMiA9IHNlc3NEYXQgJT4lICAKICBmaWx0ZXIoIWlzLm5hKHBlcmlvZF9oYWxmKSkgJT4lIAogIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0LCBwYXJ0aWNpcGFudC5jb2RlLCBwbGF5ZXIucGVyaW9kX251bWJlcikgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIHBsYXllci5wcmljZSA9IG1lYW4ocGxheWVyLnByaWNlKQogICkgJT4lCiAgZ3JvdXBfYnkocGxheWVyTnVtLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBQcmljZSA9IHBhc3RlKG1lYW4ocGxheWVyLnByaWNlKSAlPiUgcm91bmQoMiksICIgKMKxIiwgc2UocGxheWVyLnByaWNlKSAlPiUgcm91bmQoNCksICAiKSIsIHNlcD0iIikKICApCgprYWJsZSgKICBmb3JtYXQgPSAibWFya2Rvd24iLAogIGRmMiAlPiV0aWR5cjo6c3ByZWFkKAogICAgcGxheWVyLnRyYW5zcG9ydF9jb3N0LCBQcmljZQogICksCiAgYWxpZ24gPSBjKCJsIiwiYyIsImMiLCJjIiwiYyIsImMiKSwKICAjIGNvbC5uYW1lcyA9IGMoIiIsICJ0ID0gMC4xIiwidCA9IDAuMjUiLCJ0ID0gMC41IiwidCA9IDAuNzUiLCJ0ID0gMSIpLAogIGNhcHRpb24gPSAiYWRzZnNlIgopCgpgYGAKCgpTdHJvbmcgZXZpZGVuY2UgZm9yIEh5cG90aGVzaXMgMS4gCgotIExvb2tpbmcgYXQgdGhlIGF2ZXJhZ2UgcHJpY2VzIHdpdGhpbiBhIHBlcmlvZCAoYWxsIDIwIHN1YnBlcmlvZHMpIHdpdGggdGhlIHNhbWUgcGxheWVyIG51bWJlciBhbmQgdHJhbnNwb3J0IGNvc3QsIHRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gcHJpY2VzIGF0IGVhY2ggdHJhbnNwb3J0IGxldmVsIGJldHdlZW4gcGxheWVyIG51bWJlciB0cmVhdG1lbnRzLiAKCgotIEV2ZW4gY29tcGFyaW5nIGB0ID0gNi4wYCBpbiB0aGUgZm91ciBwbGF5ZXIgZ2FtZSAtLSB0aGUgdHJhbnNwb3J0IGNvc3QgaW4gd2hpY2ggdGhlIGZvdXItcGxheWVyIGdhbWUgd2l0aCBoaWdoZXN0IHByaWNlcyAtLQp0byBgdCA9IDAuMjVgIGluIHRoZSB0d28gcGxheWVyIGdhbWUgLS0gaW4gd2hpY2ggcHJpY2VzIHdlcmUgdGhlIGxvd2VzdCBpbiB0aGUgdHdvLXBsYXllciBnYW1lIC0tIHRoZSB0d28gcGxheWVyIGdhbWUgaGFzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnRseSBoaWdoZXIgcHJpY2VzIChwLXZhbHVlIDwgMC4wMDEpLiAKCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsICBjYWNoZT1GQUxTRX0KCmRmMiA9IHNlc3NEYXQgJT4lICAKICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCwgcGFydGljaXBhbnQuY29kZSwgcGxheWVyLnBlcmlvZF9udW1iZXIpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBwbGF5ZXIucHJpY2UgPSBtZWFuKHBsYXllci5wcmljZSkKICApCiMgMC4xMCwgMC4yNSwgMC40MCwgMC42MGAKCgp3aXRoKGRmMiwgCiAgICAgdC50ZXN0KHBsYXllci5wcmljZVsocGxheWVyTnVtID09ICJUd28gUGxheWVyIiAmIHBsYXllci50cmFuc3BvcnRfY29zdCA9PSAwLjI1KV0sCiAgICAgICAgICAgIHBsYXllci5wcmljZVsocGxheWVyTnVtID09ICJGb3VyIFBsYXllciIgJiBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QgPT0gMC42KV0KICAgICApCikKd2l0aChkZjIsIAogICAgIHdpbGNveC50ZXN0KHBsYXllci5wcmljZVsocGxheWVyTnVtID09ICJUd28gUGxheWVyIiAmIHBsYXllci50cmFuc3BvcnRfY29zdCA9PSAwLjI1KV0sIAogICAgICAgICAgICBwbGF5ZXIucHJpY2VbKHBsYXllck51bSA9PSAiRm91ciBQbGF5ZXIiICYgcGxheWVyLnRyYW5zcG9ydF9jb3N0ID09IDAuNildCiAgICAgKQopCgoKYGBgCgojIEh5cG90aGVzaXMgMiAtIHNoaXBwaW5nIGNvc3RzIGFuZCBtYXJrLXVwcwoKKipIeXBvdGhlc2lzIDIqKiAtICpUaGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNob3BwaW5nIGNvc3RzIGFuZCBtYXJrLXVwcy4qCgojIyMgTG9va2luZyBhdCB0aGUgdHdvLXBsYXllciBnYW1lCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsICBjYWNoZT1GQUxTRX0KIyB0d28gcGxheWVyCgpkZjIgPSBzZXNzRGF0ICU+JQogICAgZHBseXI6OmZpbHRlcigKICAgICAgcGxheWVyTnVtID09ICJUd28gUGxheWVyIiwKICAgICAgIWlzLm5hKHBlcmlvZF9oYWxmKQogICAgICApJT4lCiAgZ3JvdXBfYnkocGxheWVyTnVtLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsIHBsYXllci5wZXJpb2RfbnVtYmVyLCBwYXJ0aWNpcGFudC5jb2RlLCBwZXJpb2RfaGFsZikgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIFByaWNlID0gbWVhbihwbGF5ZXIucHJpY2UpLAogICAgUHJpY2VfTWVkaWFuID0gbWVkaWFuKHBsYXllci5wcmljZSksCiAgICBwcmljZV9zZV9VcDEgPSBQcmljZSArIHNlKHBsYXllci5wcmljZSksCiAgICBwcmljZV9zZV9Ed24xID0gUHJpY2UgLSBzZShwbGF5ZXIucHJpY2UpCiAgKQojYDAuMTAsIDAuMjUsIDAuNDAsIDAuNjBgCgpwMSA9IGdncGxvdCgKICBkZjIKKSArCiAgCiAgZmFjZXRfZ3JpZChwZXJpb2RfaGFsZiB+IC4pICsKICBnZW9tX3Zpb2xpbigKICAgIGFlcyh5ID0gUHJpY2UsCiAgICAgICAgeCA9IHBsYXllci50cmFuc3BvcnRfY29zdCwKICAgICAgICBncm91cCA9IHBsYXllci50cmFuc3BvcnRfY29zdCksCiAgICBhbHBoYSA9IDAuMywKICAgIGNvbG9yID0gImdyZXk3MCIKICApICsKICBnZW9tX3JpYmJvbigKICAgIGRhdGEgPSBkZjIgJT4lIAogICAgICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCkgJT4lCiAgICAgIHN1bW1hcmlzZSgKICAgICAgICBtZWFuX3ByaWNlID0gbWVhbihQcmljZSksCiAgICAgICAgcHJpY2Vfc2VfVXAxID0gbWVhbl9wcmljZSArIHNlKFByaWNlKSwKICAgICAgICBwcmljZV9zZV9Ed24xID0gbWVhbl9wcmljZSAtIHNlKFByaWNlKQogICAgICApLCAKICAgIGFlcygKICAgICAgeCA9IHBsYXllci50cmFuc3BvcnRfY29zdCwKICAgICAgeW1heCA9IHByaWNlX3NlX1VwMSwKICAgICAgeW1pbiA9IHByaWNlX3NlX0R3bjEKICAgICksCiAgICBhbHBoYSA9IC4yCiAgKSArCiAgZ2VvbV9saW5lKAogICAgZGF0YSA9IGRmMiAlPiUgCiAgICAgIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0KSAlPiUKICAgICAgc3VtbWFyaXNlKAogICAgICAgIG1lYW5fcHJpY2UgPSBtZWFuKFByaWNlKQogICAgICApICAsIAogICAgYWVzKAogICAgICB4ID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0LAogICAgICB5ID0gbWVhbl9wcmljZQogICAgKQogICkgKwogIGdlb21faml0dGVyKAogICAgYWVzKAogICAgICB5ID0gUHJpY2UsCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QKICAgICksCiAgICAKICAgIGRhdGEgPSBkZjIsCiAgICB3aWR0aCA9IDAuMDIsCiAgICBoZWlnaHQgPSAwLAogICAgYWxwaGEgPSAwLjMpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgYnJlYWtzID0gYygwLjEsIDAuMjUsIDAuNCwgMC42KQogICkgKwogIHRoZW1lX2J3KCkgKwogIGxhYnMoCiAgICB4ID0gIlNob3BwaW5nIENvc3QiLAogICAgeSA9ICJQcmljZSIsCiAgICB0aXRsZSA9ICJBdmVyYWdlIFBlcmlvZCBQcmljZXMgLSBUd28gUGxheWVycyIKICApICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwwLjcpLCB5bGltID0gYygwLDEpKSAKcDEKYGBgCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsICBjYWNoZT1GQUxTRX0KIyBGb3VyIHBsYXllcgoKZGYyID0gc2Vzc0RhdCAlPiUKICAgICAgZHBseXI6OmZpbHRlcigKICAgICAgcGxheWVyTnVtID09ICJGb3VyIFBsYXllciIsCiAgICAgICFpcy5uYShwZXJpb2RfaGFsZikKICAgICAgKSU+JQogIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0LCBwbGF5ZXIucGVyaW9kX251bWJlciwgcGFydGljaXBhbnQuY29kZSwgcGVyaW9kX2hhbGYpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBQcmljZSA9IG1lYW4ocGxheWVyLnByaWNlKSwKICAgIFByaWNlX01lZGlhbiA9IG1lZGlhbihwbGF5ZXIucHJpY2UpLAogICAgcHJpY2Vfc2VfVXAxID0gUHJpY2UgKyBzZShwbGF5ZXIucHJpY2UpLAogICAgcHJpY2Vfc2VfRHduMSA9IFByaWNlIC0gc2UocGxheWVyLnByaWNlKQogICkKCgoKcDIgPSBnZ3Bsb3QoCiAgZGYyCikgKwogIGZhY2V0X2dyaWQocGVyaW9kX2hhbGYgfiAuKSArCiAgZ2VvbV92aW9saW4oCiAgICBhZXMoeSA9IFByaWNlLAogICAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgICAgZ3JvdXAgPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpLAogICAgYWxwaGEgPSAwLjMsCiAgICBjb2xvciA9ICJncmV5NzAiCiAgKSArCiAgZ2VvbV9yaWJib24oCiAgICBkYXRhID0gZGYyICU+JSAKICAgICAgZ3JvdXBfYnkocGxheWVyTnVtLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICU+JQogICAgICBzdW1tYXJpc2UoCiAgICAgICAgbWVhbl9wcmljZSA9IG1lYW4oUHJpY2UpLAogICAgICAgIHByaWNlX3NlX1VwMSA9IG1lYW5fcHJpY2UgKyBzZShQcmljZSksCiAgICAgICAgcHJpY2Vfc2VfRHduMSA9IG1lYW5fcHJpY2UgLSBzZShQcmljZSkKICAgICAgKSwgCiAgICBhZXMoCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgIHltYXggPSBwcmljZV9zZV9VcDEsCiAgICAgIHltaW4gPSBwcmljZV9zZV9Ed24xCiAgICApLAogICAgYWxwaGEgPSAuMgogICkgKwogIGdlb21fbGluZSgKICAgIGRhdGEgPSBkZjIgJT4lIAogICAgICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCkgJT4lCiAgICAgIHN1bW1hcmlzZSgKICAgICAgICBtZWFuX3ByaWNlID0gbWVhbihQcmljZSkKICAgICAgKSAgLCAKICAgIGFlcygKICAgICAgeCA9IHBsYXllci50cmFuc3BvcnRfY29zdCwKICAgICAgeSA9IG1lYW5fcHJpY2UKICAgICkKICApICsKICBnZW9tX2ppdHRlcigKICAgIGFlcygKICAgICAgeSA9IFByaWNlLAogICAgICB4ID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0CiAgICApLAogICAgCiAgICBkYXRhID0gZGYyLAogICAgd2lkdGggPSAwLjAyLAogICAgaGVpZ2h0ID0gMCwKICAgIGFscGhhID0gMC4zKSArIAogIHNjYWxlX3hfY29udGludW91cygKICAgIGJyZWFrcyA9IGMoMC4xLCAwLjI1LCAwLjQsIDAuNikKICApICsKICB0aGVtZV9idygpICsKICBsYWJzKAogICAgeCA9ICJTaG9wcGluZyBDb3N0IiwKICAgIHkgPSAiUHJpY2UiLAogICAgdGl0bGUgPSAiQXZlcmFnZSBQZXJpb2QgUHJpY2VzIC0gRm91ciBQbGF5ZXJzIgogICkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLDAuNyksIHlsaW0gPSBjKDAsMSkpIApwMgoKYGBgCgoKCmBgYHtyLCBlY2hvID0gRiwgZXZhbCA9IFQsIHRpZHkgPSBUfQoKZGYgPSBzZXNzRGF0ICU+JQogIGZpbHRlcigKICAgICFpcy5uYShwZXJpb2RfaGFsZikKICApICU+JSAKICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCwgcGxheWVyLnBlcmlvZF9udW1iZXIsIHBhcnRpY2lwYW50LmNvZGUpICU+JQogIGRwbHlyOjpzdW1tYXJpc2UoCiAgICBQcmljZSA9IG1lYW4ocGxheWVyLnByaWNlKQogICkKCmRmID0gZGYgJT4lCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0KSAlPiUKICBzdW1tYXJpc2UoCiAgICBuPW4oKSwKICAgIG1lYW5fcHJpY2UgPSBtZWFuKFByaWNlKSAlPiUgcm91bmQoMyksICAKICAgIG1lZGlhbl9wcmljZSA9IG1lZGlhbihQcmljZSkgJT4lIHJvdW5kKDMpLAogICAgc2VfcHJpY2UgPSAoc2QoUHJpY2UpLyhuKV4wLjUpICAlPiUgcm91bmQoMykKICApIAoKa2FibGUoCiAgZm9ybWF0ID0gIm1hcmtkb3duIiwgCiAgZGYsICBhbGlnbiA9IGMoImMiKSwKICBjb2wubmFtZXMgPSBjKCIiLCJTaG9wcGluZyBDb3N0IiwiTiIsIk1lYW4gUHJpY2UiLCJNZWRpYW4gUHJpY2UiLCJTdGFuZGFyZCBFcnJvciIpCikKYGBgCgpSZWNhbGwgdGhlcmUgd2VyZSBgciBzZXNzRGF0ICU+JSBmaWx0ZXIocGxheWVyTnVtID09ICJGb3VyIFBsYXllciIpICU+JSB1bmdyb3VwICU+JSBkaXN0aW5jdChwYXJ0aWNpcGFudC5jb2RlKSAlPiUgbnJvd2Agc3ViamVjdHMgaW4gdGhlIGZvdXItcGxheWVyIHRyZWF0bWVudCBhbmQgYHIgc2Vzc0RhdCAlPiUgZmlsdGVyKHBsYXllck51bSA9PSAiVHdvIFBsYXllciIpICU+JSB1bmdyb3VwICU+JSBkaXN0aW5jdChwYXJ0aWNpcGFudC5jb2RlKSAlPiUgbnJvd2Agc3ViamVjdHMgaW4gdGhlIHR3by1wbGF5ZXIgdHJlYXRtZW50LiAKCgojIyBJbml0aWFsIExvb2sgYXQgVHdvLVBsYXllciBHYW1lCgpGaXJzdCwgd2l0aGluIHRoZSB0d28gcGxheWVyIGdhbWUsIGNvbXBhcmluZyBwcmljZXMgaW4gYHQgPSAwLjFgIGFuZCBgdCA9IDAuNmAgKHNlZSBiZWxvdyksIHRoZXJlIGlzIHRvIGJlIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlLiAKClRoZXJlIGlzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gcHJpY2VzIGFuZCBzaG9wcGluZyBjb3N0IHRyZWF0bWVudHMuIEluIGhpZ2hlciBzaG9wcGluZyBjb3N0IHNldHRpbmdzIHN1YmplY3RzIHRlbmRlZCB0byBoYXZlIGhpZ2hlciBwcmljZXMuIAoKLSBVbml0IG9mIG9ic2VydmF0aW9uIGlzIGFuIGluZGl2aWR1YWwncyBhdmVyYWdlIHByaWNlIHdpdGhpbiBhIHBlcmlvZCwgYXQgYSBzZXQgc2hvcHBpbmcgY29zdCBsZXZlbC4gCi0gQSB0IHRlc3QgY29tcGFyaW5nIHByaWNlcyBiZXR3ZWVuIG1pbiBhbmQgbWF4IHNob3BwaW5nIGNvc3RzLiBQcmljZXMgYXJlIGF2ZXJhZ2UgcHJpY2UgYXQgdGhlIHNlc3Npb24sIHBhcnRpY2lwYW50LCBhbmQgcGVyaW9kIGxldmVsLiBQLXZhbHVlIDIuODY3ZS0xMQotIEEgTVcgcmFuayBzdW0gdGVzdCBjb21wYXJpbmcgcHJpY2VzIGJldHdlZW4gbWluIGFuZCBtYXggc2hvcHBpbmcgY29zdHMuIFByaWNlcyBhcmUgYXZlcmFnZSBwcmljZSBhdCB0aGUgc2Vzc2lvbiwgcGFydGljaXBhbnQsIGFuZCBwZXJpb2QgbGV2ZWwuIFAtdmFsdWUgMS4xMmUtMDkKCmBgYHtyLCBlY2hvPUZBTFNFfQpkZiA9ICBzZXNzRGF0ICU+JQogIGZpbHRlcigKICAgICFpcy5uYShwZXJpb2RfaGFsZiksCiAgICBwbGF5ZXJOdW0gPT0gIlR3byBQbGF5ZXIiCiAgKSAlPiUgCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KHNlc3Npb24uY29kZSwgcGFydGljaXBhbnQuY29kZSwgcGxheWVyLnBlcmlvZF9udW1iZXIsIHBsYXllci50cmFuc3BvcnRfY29zdCkgJT4lCiAgIHN1bW1hcmlzZSgKICAgICBtZWFuX3ByaWNlID0gbWVhbihwbGF5ZXIucHJpY2UpCiAgICkKd2l0aChkZiwgdC50ZXN0KG1lYW5fcHJpY2VbcGxheWVyLnRyYW5zcG9ydF9jb3N0ID09IDAuMV0sIG1lYW5fcHJpY2VbcGxheWVyLnRyYW5zcG9ydF9jb3N0ID09IDAuNl0pKQp3aXRoKGRmLCB3aWxjb3gudGVzdChtZWFuX3ByaWNlW3BsYXllci50cmFuc3BvcnRfY29zdCA9PSAwLjFdLCBtZWFuX3ByaWNlW3BsYXllci50cmFuc3BvcnRfY29zdCA9PSAwLjZdKSkKCmBgYAoKCgojIyBJbml0aWFsIExvb2sgYXQgRm91ci1QbGF5ZXIgR2FtZQoKSW4gdGhlIGZvdXItcGxheWVyIGdhbWUgdGhlIHJlbGF0aW9uc2hpcCwgYXQgbGVhc3QgYmV0d2VlbiB0aGUgbG93ZXN0IGFuZCBoaWdoZXN0IHNob3BwaW5nIGNvc3QsIGRvZXMgbm90IGFwcGVhciBzdHJvbmdlci4KCi0gQSB0IHRlc3QgY29tcGFyaW5nIHByaWNlcyBiZXR3ZWVuIG1pbiBhbmQgbWF4IHNob3BwaW5nIGNvc3RzLiBQcmljZXMgYXJlIGF2ZXJhZ2UgcHJpY2UgYXQgdGhlIHNlc3Npb24sIHBhcnRpY2lwYW50LCBhbmQgcGVyaW9kIGxldmVsLiBQLXZhbHVlIDAuOTQ1OS4KLSBBIE1XIHJhbmsgc3VtIHRlc3QgY29tcGFyaW5nIHByaWNlcyBiZXR3ZWVuIG1pbiBhbmQgbWF4IHNob3BwaW5nIGNvc3RzLiBQcmljZXMgYXJlIGF2ZXJhZ2UgcHJpY2UgYXQgdGhlIHNlc3Npb24sIHBhcnRpY2lwYW50LCBhbmQgcGVyaW9kIGxldmVsLiBQLXZhbHVlID0gMC44OTE5CgoKYGBge3IsIGVjaG89RkFMU0V9CmRmID0gc2Vzc0RhdCAlPiUKICBmaWx0ZXIoCiAgICAhaXMubmEocGVyaW9kX2hhbGYpLAogICAgcGxheWVyTnVtID09ICJGb3VyIFBsYXllciIKICApICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoc2Vzc2lvbi5jb2RlLCBwYXJ0aWNpcGFudC5jb2RlLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QscGxheWVyLnBlcmlvZF9udW1iZXIpICU+JQogICBzdW1tYXJpc2UoCiAgICAgbWVhbl9wcmljZSA9IG1lYW4ocGxheWVyLnByaWNlKQogICApCndpdGgoZGYsIHQudGVzdChtZWFuX3ByaWNlW3BsYXllci50cmFuc3BvcnRfY29zdCA9PSAwLjFdLCBtZWFuX3ByaWNlW3BsYXllci50cmFuc3BvcnRfY29zdCA9PSAwLjZdKSkKd2l0aChkZiwgd2lsY294LnRlc3QobWVhbl9wcmljZVtwbGF5ZXIudHJhbnNwb3J0X2Nvc3QgPT0gMC4xXSwgbWVhbl9wcmljZVtwbGF5ZXIudHJhbnNwb3J0X2Nvc3QgPT0gMC42XSkpCgpgYGAKCgojIyBNb2RlbAoKT25seSBsb29raW5nIGF0IHRoZSBmaXJzdCBoYWxmIG9mIHBlcmlvZHMKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9RkFMU0V9CgpkZiA9IHNlc3NEYXQgJT4lIAogIGZpbHRlcigKICAgICFpcy5uYShwZXJpb2RfaGFsZiksCiAgICBwZXJpb2RfaGFsZiA9PSAiRmlyc3QgSGFsZiIKICApICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkocGxheWVyTnVtLCBzZXNzaW9uLmNvZGUsIHBhcnRpY2lwYW50LmNvZGUsIHBsYXllci5wZXJpb2RfbnVtYmVyLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICU+JQogIHN1bW1hcmlzZSgKICAgIHByaWNlID0gbWVhbihwbGF5ZXIucHJpY2UpLAogICAgbWVkaWFuX3ByaWNlID0gbWVkaWFuKHBsYXllci5wcmljZSkKICApCgpwMT0gZ2dwbG90KAogIGRmLAogIGFlcygKICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICB5ID0gcHJpY2UsCiAgICBncm91cCA9IHBsYXllck51bSwKICAgIGNvbG9yID0gcGxheWVyTnVtCiAgKQopICsKICBnZW9tX2ppdHRlcigKICAgIGFlcyh5ID0gcHJpY2UpLAogICAgd2lkdGggPSAwLjA3LAogICAgYWxwaGEgPSAuMSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICB0aGVtZV9idygpICsKICBsYWJzKAogICAgeCA9ICJTaG9wcGluZyBDb3N0IiwKICAgIHkgPSAiUHJpY2UiCiAgICAKICApCnAxCmBgYAoKSGVyZSB3ZSBoYXZlIGEgbG9nLWxvZyBtb2RlbCByZWdyZXNzaW5nIHByaWNlcyBvbiBzaG9wcGluZyBjb3N0cywgd2l0aCBwbGF5ZXItbnVtYmVyIGZpeGVkIGVmZmVjdHMuIAoKJGxuKFBfe2lwfSkgPSBcYmV0YV8wICsgXGJldGFfMSBcZGVsdGFfe2l9ICsgXGJldGFfMiBsbihTX3tpcH0pICsgXGJldGFfMyBQZXJpb2RfcCArIFxlcHNpbG9uX3soaXApfSQKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9RkFMU0V9CgpyZWcxID0gbG0oCiAgbG9nKHByaWNlKSB+IHBsYXllck51bSArIGxvZyhwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICsgcGxheWVyLnBlcmlvZF9udW1iZXIsCiAgZGF0YSA9IGRmICU+JSBtdXRhdGUocHJpY2UgPSBwcmljZSArIDAuMDEpCikKCnN1bW1hcnkocmVnMSkKYGBgCgoKLSBXaGVyZSAkUF97aXB9JCBpcyB0aGUgYXZlcmFnZSBwcmljZSBmb3IgZm9yIHRoaXMgcGFydGljaXBhbnQgaW4gdGhpcyBwZXJpb2QsIHRoZSBhdmVyYWdlIG9mIDIwIHN1Yi1wZXJpb2RzLiAKLSAkXGRlbHRhX3tpfSQgaXMgYW4gaW5kaWNhdG9yIGVxdWFsIHRvIDEgaWYgaW5kaXZpZHVhbCAkaSQgcGFydGljaXBhdGVkIGluIHRoZSB0d28tcGxheWVyIHRyZWF0bWVudC4KLSAkU19pcCQgaXMgdGhlIHNob3BwaW5nIGNvc3QgdGhpcyBpbmRpdmlkdWFsIGZhY2VkIGluIHRoaXMgcGVyaW9kLiAKLSB3aGVyZSAkUGVyaW9kX3AkIGlzIHRoZSBwZXJpb2QgbnVtYmVyLiBQZXJpb2QgZml4ZWQgZWZmZWN0cy4gCgpJbiB0aGlzIHNwZWNpZmljYXRpb24sIHRoZSBjb2VmZmljaWVudCAkXGJldGFfMiQgbWVhc3VyZXMgdGhlIGF2ZXJhZ2UgZWZmZWN0IG9mIGJlaW5nIGFzc2lnbmVkIHRvIHRoZSBsZXNzIGNvbXBldGl0aXZlIHR3by1wbGF5ZXIgdHJlYXRtZW50IGdyb3VwLiBXaXRoICRcYmV0YV8yID0gLTAuMDU2MDQwJCwgYSAxJSBpbmNyZWFzZSBpbiBzaG9wcGluZyBjb3N0cyBsZWFkcyB0byBhIC01LjYlIGRlY3JlYXNlIGluIHByaWNlcy4gVGhpcyBpcyBzaWduaWZpY2FudC4gCgojIEh5cG90aGVzaXMgMyAtIG1hcmstdXAgcmVzcG9uc2l2ZW5lc3MgdG8gY29tcGV0aXRpb24gCgoqKkh5cG90aGVzaXMgMyoqLiAqTWFyay11cHMgd2lsbCBiZSBsZXNzIHJlc3BvbnNpdmUgdG8gY2hhbmdlcyBpbiBzaG9wcGluZyBjb3N0cyBpbiBsZXNzIGNvbXBldGl0aXZlIChsb3dlciBOKSBtYXJrZXRzLioKCiRsbihQcmljZV97KGkscCl9KSA9IFxiZXRhXzAgKyBcYmV0YV8xIFxkZWx0YV97MnB9ICsgXGJldGFfMiBsbihTaG9wcGluZ0Nvc3QpICsgXGJldGFfMyBcZGVsdGFfe2l9IGxuKFNob3BwaW5nQ29zdCkgICsgXGVwc2lsb25feyhpLHApfSQKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9RkFMU0V9CgpyZWcyID0gbG0oCiAgbG9nKHByaWNlKSB+IHBsYXllck51bSArIGxvZyhwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICsgcGxheWVyTnVtOmxvZyhwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpICwKICBkYXRhID0gZGYgJT4lIG11dGF0ZShwcmljZSA9IHByaWNlICsgMC4wMSkKKQoKc3VtbWFyeShyZWcyKQpgYGAKCgoKVGhlIGNvZWZmaWNpZW50ICRcYmV0YV8yJCBlc3RpbWF0ZXMgdGhhdCBhIDElIGluY3JlYXNlIGluIHNob3BwaW5nIGNvc3RzIHdpbGwgbGVhdmUgdG8gYSAzLjQlIGRlY3JlYXNlIGluIHByaWNlcyBpbiB0aGUgZm91ci1wbGF5ZXIgZ2FtZS4gVGhlICRcYmV0YV8zJCBjb2VmZmljaWVudCBpbmRpY2F0ZXMgKmEgb25lIHVuaXQgaW5jcmVhc2UgaW4gc2hvcHBpbmcgY29zdCBsZWFkcyB0byBhIDUuOSUgZGVjcmVhc2UgaW4gcHJpY2VzIGluIHRoZSB0d28tcGxheWVyIGdhbWUgcmVsYXRpdmUgdG8gdGhlIDQtcGxheWVyIGdhbWUqIi4gCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXJyb3I9RkFMU0UsIGNhY2hlPUZBTFNFfQoKIyBsaWJyYXJ5KG1lbWlzYykKIyBsaWJyYXJ5KHBhbmRlcikKIyAKIyBteXRhYmxlIDwtIG10YWJsZSgKIyAgICdNb2RlbCAxJyA9IHJlZzEsCiMgICAnTW9kZWwgMicgPSByZWcyLAojICAgc3VtbWFyeS5zdGF0cyA9IGMoJ1Itc3F1YXJlZCcsJ0YnLCdwJywnTicpKQojIAojIChteXRhYmxlKQpgYGAKCgp8IERlcGVuZGVudCBWYXI6ICRsbihQX3tpcH0pJCAgICAgICAgICAgICAgfCBNb2RlbCAxICB8ICB8IE1vZGVsIDIgICAgfCB8CnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tOnw6LS06fDotLS0tLS0tLS0tLS06fDotLS0tOnwKfCAgJFxkZWx0YV97aX0kICh0d28tcGxheWVyKSAgICAgICAgICAgICAgIHwgMC41NTkxMDEgICAgfCBcKlwqXCogfCAgMC40NTA1OCAgICB8IFwqXCpcKiAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMC4wMTU4NzApICB8ICAgICAgICB8ICgwLjA0MTU1KSAgIHwgfAp8ICAkbG4oU2hvcHBpbmdDb3N0KSQgICAgICAgICAgICAgICAgICAgICAgfCAtMC4wNTYwNDAgICB8IFwqXCpcKiB8IC0wLjA0ODQ0ICAgICB8IFwqXCpcKiAgfCAKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDAuMDExMDIzKSAgfCAgICAgICAgfCAoMC4wMTU1OCkgICB8IHwKfCAgJFxkZWx0YV97aX0gXGNkb3QgbG4oU2hvcHBpbmdDb3N0KSQgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgfCAtMC4wNTg1NyAgICB8IFwqIHwgIAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICB8ICgwLjAyNDY0KSAgIHwgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgIHwgfCAKfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0gfCAtLS0gfCAtLS0tLS0gfCAtLS0gfAp8ICBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNTUyICAgIHwgIHwgNTUyICAgICB8ICB8CgojIEh5cG90aGVzaXMgNCAtIENvbGx1c2lvbiBhbmQgU2hvcHBpbmcgQ29zdHMKCioqSHlwb3RoZXNpcyA0KiouICpDb2xsdXNpb24gd2lsbCBiZSBlYXNpZXIgdG8gZm9ybSBpbiBsb3cgc2hvcHBpbmcgY29zdCBlbnZpcm9ubWVudHMqCgpEZWZpbmUgY29sbHVzaW9uCgojIyBJZGVhIDEgLSBKb2ludCBwb3NpdGl2ZSBwcm9maXRzLiAKCkEgc3ViamVjdCBpcyBzYWlkIHRvIGJlICdjb2xsdWRpbmcnIHdoZW4gdGhleSBhbmQgdGhlaXIgYWRqYWNlbnQgcGxheWVycyBoYXZlIGpvaW50bHkgcG9zaXRpdmUgcHJvZml0cy4gCiAgICAtIEluIHRoZSBzYXZlIG9mIHRoZSB0d28tcGxheWVyIGdhbWUsIGJvdGggcGxheWVycycgcHJvZml0cyBhcmUgcG9zaXRpdmUuIEluIHRoZSBjYXNlIG9mIHRoZSBmb3VyLXBsYXllciBnYW1lLCB0aGUgcHJvZml0cyBvZiB0aGUgdHdvIHBsYXllcnMgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IChjaXJjbGUgbWFya2V0cGxhY2UpIGFyZSBwb3NpdGl2ZS4gCiAgICAtIFRoaXMgcG9zZXMgb2YgcHJvYmxlbSBpbiBjb21wYXJpbmcgImNvbGx1c2lvbiIgYmV0d2VlbiB0d28gYW5kIGZvdXItcGxheWVyIGdhbWVzLiBTbyB3ZSBzaG91bGQgbm90IGRvIHRoYXQuIAotIExvb2sgYXQgdmlvbGluZXMgZm9yIGJpdCAtIGJpLW1vZGFsIHNwbGl0cyBpbiBkaXN0cmlidXRpb24uIAoKCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9RkFMU0V9CgpkZiA9IHNlc3NEYXQgJT4lCiAgZHBseXI6OmZpbHRlcigKICAgIHBsYXllci5zdWJwZXJpb2RfbnVtYmVyID4gMCwKICAgIHBsYXllci5zdWJwZXJpb2RfbnVtYmVyIDwgMjEKICApICU+JQogIGdyb3VwX2J5KHBsYXllck51bSwgc2Vzc2lvbi5jb2RlLHBsYXllci50cmFuc3BvcnRfY29zdCxwbGF5ZXJOdW0pICU+JQogIGRwbHlyOjptdXRhdGUoCiAgICBwcm9maXQgPSBzY29yZV9zdWJwZXJpb2QsCiAgICBwbGF5ZXIubG9jID0gcGFzdGUoIkxvYyIscGxheWVyLmxvYywgc2VwPSIiKQogICkgJT4lCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UocGxheWVyTnVtLCBzZXNzaW9uLmNvZGUsIHBsYXllci5wZXJpb2RfbnVtYmVyLCBwbGF5ZXIucGVyaW9kX251bWJlciwgcGxheWVyLnN1YnBlcmlvZF9udW1iZXIsZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwgcGxheWVyLmxvYykgJT4lCiAgZHBseXI6OnNlbGVjdChwbGF5ZXJOdW0sIHNlc3Npb24uY29kZSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0LCBwbGF5ZXIucGVyaW9kX251bWJlciwgcGxheWVyLnN1YnBlcmlvZF9udW1iZXIsIGdyb3VwLmlkX2luX3N1YnNlc3Npb24sIHBsYXllci5sb2MsIHByb2ZpdCkKICAKZGYycCA9IGRmICU+JQogIGZpbHRlcihwbGF5ZXJOdW0gPT0gIlR3byBQbGF5ZXIiKSAlPiUgCiAgZ3JvdXBfYnkoZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiwgcGxheWVyLnBlcmlvZF9udW1iZXIsIHBsYXllci5zdWJwZXJpb2RfbnVtYmVyKSAlPiUKICBzcHJlYWQocGxheWVyLmxvYywgcHJvZml0KSAlPiUKICBtdXRhdGUoCiAgICBqb2luUG9zUHJvZml0ID0gaWZlbHNlKExvYzAuMjUgPiAwICYgTG9jMC43NSA+IDAsIDEsIDApCiAgKQoKZGY0cCA9IGRmICU+JQogIGZpbHRlcihwbGF5ZXJOdW0gPT0gIkZvdXIgUGxheWVyIikgJT4lIAogIGdyb3VwX2J5KGdyb3VwLmlkX2luX3N1YnNlc3Npb24pICU+JQogIHNwcmVhZChwbGF5ZXIubG9jLCBwcm9maXQpICU+JQogIG11dGF0ZSgKICAgIGpvaW5Qb3NQcm9maXQgPSBpZmVsc2UoTG9jMC4xMjUgPiAwICYgTG9jMC4zNzUgJiBMb2MwLjYyNSA+IDAgJiBMb2MwLjg3NSA+IDAsIDEsIDApCiAgKQoKCmRmMiA9IGJpbmRfcm93cygKICBkZjRwLCBkZjJwCikKCgoKCmthYmxlKAogIGZvcm1hdCA9ICJtYXJrZG93biIsIAogIGJpbmRfcm93cygKICAgIGRmMnAgJT4lCiAgICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCkgJT4lCiAgICBzdW1tYXJpc2UoCiAgICAgIGpvaW5Qb3NQcm9maXRfbWVhbiA9IG1lYW4oam9pblBvc1Byb2ZpdCksCiAgICAgIG4gPSBsZW5ndGgodW5pcXVlKHBhc3RlKGdyb3VwLmlkX2luX3N1YnNlc3Npb24gLHBsYXllci5wZXJpb2RfbnVtYmVyKSkpCiAgICApLAogICAgZGY0cCAlPiUKICAgIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0KSAlPiUKICAgIHN1bW1hcmlzZSgKICAgICAgam9pblBvc1Byb2ZpdF9tZWFuID0gbWVhbihqb2luUG9zUHJvZml0KSwKICAgICAgbiA9IGxlbmd0aCh1bmlxdWUocGFzdGUoZ3JvdXAuaWRfaW5fc3Vic2Vzc2lvbiAscGxheWVyLnBlcmlvZF9udW1iZXIpKSkKICAgICkKICApLCAgCiAgYWxpZ24gPSBjKCJjIiksCiAgY29sLm5hbWVzID0gYygiIiwiU2hvcHBpbmcgQ29zdCIsIlBlcmNlbnQgb2YgUGVyaW9kIEpvaW50IFBvc2l0aXZlIFByb2ZpdHMiLCJQZXJpb2QgR3JvdXAgT2J2c2VydmF0aW9uIikKKQoKCmBgYAoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGVycm9yPUZBTFNFLCBjYWNoZT1GQUxTRX0KCgoKZ2dwbG90KAogIGRmMiAlPiUgCiAgICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci5wZXJpb2RfbnVtYmVyLCBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsIGdyb3VwLmlkX2luX3N1YnNlc3Npb24pICU+JQogICAgZHBseXI6OnN1bW1hcmlzZSgKICAgICAgam9pblBvc1Byb2ZpdCA9IG1lYW4oam9pblBvc1Byb2ZpdCkKICAgICkKKSArCiAgZmFjZXRfZ3JpZChwbGF5ZXJOdW0gfi4pICsKICBnZW9tX3Zpb2xpbigKICAgIGFlcyh5ID0gam9pblBvc1Byb2ZpdCwKICAgICAgICB4ID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0LAogICAgICAgIGdyb3VwID0gcGxheWVyLnRyYW5zcG9ydF9jb3N0KSwKICAgIGFscGhhID0gMC4zLAogICAgY29sb3IgPSAiZ3JleTcwIgogICkgKwogIGdlb21fcmliYm9uKAogICAgZGF0YSA9IGRmMiAlPiUgCiAgICAgIGdyb3VwX2J5KHBsYXllck51bSwgcGxheWVyLnRyYW5zcG9ydF9jb3N0KSAlPiUKICAgICAgc3VtbWFyaXNlKAogICAgICAgIG1lYW5fam9pblBvc1Byb2ZpdCA9IG1lYW4oam9pblBvc1Byb2ZpdCksCiAgICAgICAgam9pblBvc1Byb2ZpdF9zZV9VcDEgPSBtZWFuX2pvaW5Qb3NQcm9maXQgKyBzZShqb2luUG9zUHJvZml0KSwKICAgICAgICBqb2luUG9zUHJvZml0X3NlX0R3bjEgPSBtZWFuX2pvaW5Qb3NQcm9maXQgLSBzZShqb2luUG9zUHJvZml0KQogICAgICApLCAKICAgIGFlcygKICAgICAgeCA9IHBsYXllci50cmFuc3BvcnRfY29zdCwKICAgICAgeW1heCA9IGpvaW5Qb3NQcm9maXRfc2VfVXAxLAogICAgICB5bWluID0gam9pblBvc1Byb2ZpdF9zZV9Ed24xCiAgICApLAogICAgYWxwaGEgPSAuMgogICkgKwogIGdlb21fbGluZSgKICAgIGRhdGEgPSBkZjIgJT4lIAogICAgICBncm91cF9ieShwbGF5ZXJOdW0sIHBsYXllci50cmFuc3BvcnRfY29zdCkgJT4lCiAgICAgIHN1bW1hcmlzZSgKICAgICAgICBtZWFuX2pvaW5Qb3NQcm9maXQgPSBtZWFuKGpvaW5Qb3NQcm9maXQpCiAgICAgICkgICwgCiAgICBhZXMoCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QsCiAgICAgIHkgPSBtZWFuX2pvaW5Qb3NQcm9maXQKICAgICkKICApICsKICBnZW9tX2ppdHRlcigKICAgIGFlcygKICAgICAgeSA9IGpvaW5Qb3NQcm9maXQsCiAgICAgIHggPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QKICAgICksCiAgICB3aWR0aCA9IDAuMDIsCiAgICBoZWlnaHQgPSAwLAogICAgYWxwaGEgPSAwLjMpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKAogICAgYnJlYWtzID0gYygwLjEsIDAuMjUsIDAuNCwgLjYpCiAgKSArCiAgdGhlbWVfYncoKSArCiAgbGFicygKICAgIHggPSAiU2hvcHBpbmcgQ29zdCIsCiAgICB5ID0gIlBlcmNlbnQgb2YgUGVyaW9kIHdpdGggSm9pbnQgUG9zaXRpdmUgUHJvZml0cyIsCiAgICB0aXRsZSA9ICJKb2ludCBQb3NpdGl2ZSBQcm9maXRzIgogICkKCgpgYGAKClRoZXJlIGlzIHZpc3VhbGx5IHN1Z2dlc3RpdmUgZXZpZGVuY2UgdGhhdCB3aXRoIGhpZ2hlciBzaG9wcGluZyBjb3N0cywgZ3JvdXBzIGFyZSBiZXR0ZXIgYWJsZSB0byBjb2xsdWRlLiAKCgojIyBJZGVhIDIgLSBKdXN0IGxvb2sgYXQgcHJvZml0cy4gCgpBcmUgcHJvZml0cyBoaWdoZXI/IAogICAgLSBQZXJoYXBzIHRvbyBsaW5rZWQgdG8gdGhlIGRpc2N1c3Npb24gaW4gSHlwb3RoZXNpcyAxLTMuIAoKCmBgYHtyLCBlY2hvPUZBTFNFfQoKZGYgPSAgc2Vzc0RhdCAlPiUKICBmaWx0ZXIoCiAgICBwbGF5ZXIucGVyaW9kX251bWJlciA+IDAgCiAgICAmIHBsYXllci5wZXJpb2RfbnVtYmVyIDwgMjEKICAgICYgIWlzLm5hKHBlcmlvZF9oYWxmKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShwbGF5ZXJOdW0sIHBlcmlvZF9oYWxmLCBzZXNzaW9uLmNvZGUsIHBhcnRpY2lwYW50LmNvZGUsIHBsYXllci50cmFuc3BvcnRfY29zdCxwbGF5ZXIucGVyaW9kX251bWJlcikgJT4lCiAgIHN1bW1hcmlzZSgKICAgICBtZWFuX3Byb2ZpdCA9IG1lYW4oc2NvcmVfc3VicGVyaW9kKQogICApCgpkZjIgPSBkZiAlPiUgCiAgZ3JvdXBfYnkocGxheWVyTnVtLCBwZXJpb2RfaGFsZiwgcGxheWVyLnRyYW5zcG9ydF9jb3N0KSAlPiUgCiAgc3VtbWFyaXNlKAogICAgbWVhbl9wcm9maXQgPSBtZWFuKG1lYW5fcHJvZml0KQogICkKCmdncGxvdCgKIGRmCikgKwogIGZhY2V0X2dyaWQocGxheWVyTnVtIH4gcGVyaW9kX2hhbGYpICsKICAgIGdlb21fdmlvbGluKAogICAgYWVzKAogICAgICB4ID0gKHBsYXllci50cmFuc3BvcnRfY29zdCksCiAgICAgIHkgPSBtZWFuX3Byb2ZpdCwKICAgICAgZ3JvdXAgPSBwbGF5ZXIudHJhbnNwb3J0X2Nvc3QKICAgICksIGFscGhhID0gLjgKICApICsKICBnZW9tX2ppdHRlcigKICAgIGFlcygKICAgICAgeCA9IChwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpLAogICAgICB5ID0gbWVhbl9wcm9maXQKICAgICksIAogICAgYWxwaGEgPSAuMSwKICAgIHdpZHRoID0gLjA1LCBoZWlnaHQgPSAwCiAgKSArCiAgZ2VvbV9saW5lKAogICAgZGF0YSA9IGRmMiwKICAgIGFlcygKICAgICAgeSA9IG1lYW5fcHJvZml0LCAKICAgICAgeCA9IChwbGF5ZXIudHJhbnNwb3J0X2Nvc3QpKQogICkgKwogIHRoZW1lX2J3KCkgKwogIGxhYnMoCiAgICB4ID0gIlNob3BwaW5nIENvc3QiLAogICAgeSA9ICJBdmVyYWdlIFBlcmlvZCBQcm9maXQiLAogICAgdGl0bGUgPSAiQXZlcmFnZSBQZXJpb2QgUHJvZml0cyBhbmQgU2hvcHBpbmcgQ29zdHMiCiAgKQoKCgoKYGBgCgojIyB0byBkbyBmb3IgY29sbHVzaW9uIAoKVGFpbGluZyB0aGluZzsgCgotIGdldCBpbnRvIG1vcmUgc2ltcGxlIGR5bmFtaWNzIG9mIGNvbGx1c2lvbi4uLi4gCgoKLS0tLSAKCmBgYHtyLCBlY2hvPUYsIHJlc3VsdHM9J2FzaXMnfQoKY2F0KAogICIgQ29tcGlsZWQgYnkgQ3VydGlzIEtlcGhhcnQsIGN1cnRpcy5rZXBoYXJ0QG55dS5lZHUsICIsCiAgIiB3aXRoIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gIiwKICBzZXAgPSAiIgopCmBgYAoKYGBge3IsIGVjaG89RiwgcmVzdWx0cz0nYXNpcyd9CgpjYXQoCiAgYXMuY2hhcmFjdGVyKFN5cy50aW1lKCkpLCIgR01ULCAiLAogIFN5cy50aW1lem9uZShsb2NhdGlvbiA9IFRSVUUpLAogIHNlcCA9ICIiCikKYGBgCgoKU29tZSBuZXcgc3R1ZmY6Ckxvb2sgYXQgaG93IGF2ZXJhZ2UgcHJpY2VzIGNoYW5nZSBhdCB0aGUgdGhyZXNob2xkIGFyb3VuZCB0aGUgZmlyc3QgaGFsZiBzZWNvbmQgaGFsZiBjaGFuZ2UuIEJlZ2luIGJ5IGJ1aWxkaW5nIGFuIGluZGljYXRvciBmb3Igd2hhdCB2YXJpYWJsZSBpcyBjaGFuZ2luZyAocnAsIHRyYW5zcG8sIG9yIG1pbGxjb3N0KSBhbmQgb25seSBhbmFseXplIGRhdGEgc3BlY2lmaWMgdG8gdGhvc2UgcXVlc3Rpb25zLCBvdGhlcndpc2UgeW91J3JlIG1peGluZyBhIGxvdCBvZiBlZmZlY3RzIHRvZ2V0aGVyLgoKUXVlc3Rpb24gMSwgd2hhdCBwYXJhbWV0ZXJzIGFyZSBjaGFuZ2luZyBpbiB0aGVzZSBkaWZmZXJlbnQgcGVyaW9kczoKQW5zd2VyOiBzZWUgZGF0YSB0YWJsZSBiZWxvdywgSSd2ZSBmaWd1cmVkIG91dCB3aGljaCBwYXJhbXRlcnMgY2hhbmdlIGluIGNlcnRhaW4gcGVyaW9kcy4KYGBge3IsIGVjaG89Rn0KClBlcmlvZENoYW5nZXNGaXJzdDwtc3Vic2V0KHNlc3NEYXQsIHBsYXllci5zdWJwZXJpb2RfbnVtYmVyID4gMCAmIHBsYXllci5zdWJwZXJpb2RfbnVtYmVyPDIxJnBlcmlvZF9oYWxmPT0iRmlyc3QgSGFsZiIpJT4lIAogIGdyb3VwX2J5KHBsYXllci5wZXJpb2RfbnVtYmVyLCBzZXNzaW9uLmNvZGUpICU+JSAKICBzdW1tYXJpc2UoCiAgICBUcmFuc3BvTWVhbiA9IG1lYW4ocGxheWVyLnRyYW5zcG9ydF9jb3N0KSwKICAgIG1jTWVhbj1tZWFuKHBsYXllci5tYyksCiAgICBycE1lYW49bWVhbihwbGF5ZXIucnApCiAgKQpQZXJpb2RDaGFuZ2VzU2Vjb25kPC1zdWJzZXQoc2Vzc0RhdCwgcGxheWVyLnN1YnBlcmlvZF9udW1iZXIgPiAwICYgcGxheWVyLnN1YnBlcmlvZF9udW1iZXI8MjEmcGVyaW9kX2hhbGY9PSJTZWNvbmQgSGFsZiIpJT4lIAogIGdyb3VwX2J5KHBsYXllci5wZXJpb2RfbnVtYmVyLCBzZXNzaW9uLmNvZGUpICU+JSAKICBzdW1tYXJpc2UoCiAgICBUcmFuc3BvTWVhbiA9IG1lYW4ocGxheWVyLnRyYW5zcG9ydF9jb3N0KSwKICAgIG1jTWVhbj1tZWFuKHBsYXllci5tYyksCiAgICBycE1lYW49bWVhbihwbGF5ZXIucnApCiAgKQoKUGVyaW9kQ2hhbmdlczwtbGVmdF9qb2luKFBlcmlvZENoYW5nZXNGaXJzdCxQZXJpb2RDaGFuZ2VzU2Vjb25kLGJ5ID0gYygicGxheWVyLnBlcmlvZF9udW1iZXIiLCAic2Vzc2lvbi5jb2RlIikpCgpQZXJpb2RDaGFuZ2VzPC1QZXJpb2RDaGFuZ2VzJT4lIAogIG11dGF0ZSgKICAgIFRyYW5zcG9DaGFuZ2UgPSBsb2coVHJhbnNwb01lYW4ueCktbG9nKFRyYW5zcG9NZWFuLnkpLAogICAgbWNDaGFuZ2U9bG9nKG1jTWVhbi54KS1sb2cobWNNZWFuLnkpLAogICAgcnBDaGFuZ2U9bG9nKHJwTWVhbi54KS1sb2cocnBNZWFuLnkpCiAgKQoKUGVyaW9kQ2hhbmdlczwtUGVyaW9kQ2hhbmdlcyU+JSAKICBtdXRhdGUoCiAgICBUcmFuc3BvQ2hhbmdlT25seSA9IGlmZWxzZShUcmFuc3BvQ2hhbmdlICE9IDAgJiBtY0NoYW5nZSA9PSAwJnJwQ2hhbmdlPT0wLCBUcmFuc3BvQ2hhbmdlLCBOQSksCiAgICBtY0NoYW5nZU9ubHkgPSBpZmVsc2UobWNDaGFuZ2UgIT0gMCAmIFRyYW5zcG9DaGFuZ2UgPT0gMCZycENoYW5nZT09MCwgbWNDaGFuZ2UsIE5BKSwKICAgICBycENoYW5nZU9ubHkgPSBpZmVsc2UocnBDaGFuZ2UgIT0gMCAmIFRyYW5zcG9DaGFuZ2UgPT0gMCZtY0NoYW5nZT09MCwgcnBDaGFuZ2UsIE5BKQogICkKCgpzZXNzRGF0PC0gbGVmdF9qb2luKHNlc3NEYXQsUGVyaW9kQ2hhbmdlc1ssYygicGxheWVyLnBlcmlvZF9udW1iZXIiLCJzZXNzaW9uLmNvZGUiLCJUcmFuc3BvQ2hhbmdlT25seSIsIm1jQ2hhbmdlT25seSIsInJwQ2hhbmdlT25seSIpXSxieT1jKCJwbGF5ZXIucGVyaW9kX251bWJlciIsICJzZXNzaW9uLmNvZGUiKSkKCgpgYGAKCldhbnQgdG8gZG8gYSByZWdyZXNzaW9uIG9uIHBlcmlvZHMgd2hlcmUgb25seSB0cmFuc3BvcnQgY29zdHMgY2hhbmdlZCBhbmQgdXNlIHBlcmlvZCBmaXhlZCBlZmZlY3RzIHRvIHN0cmlwIG91dCB0aGUgbGV2ZWwgZWZmZWN0cyBvZiB0aGUgb3RoZXIgcGFyYW1ldGVycy4KCmBgYHtyLCBlY2hvPUZ9CgojIFRyYW5zcG9SZWc8LXN1YnNldChzZXNzRGF0LCBwbGF5ZXIuc3VicGVyaW9kX251bWJlciA+IDAgJiBwbGF5ZXIuc3VicGVyaW9kX251bWJlcjwyMSZUcmFuc3BvQ2hhbmdlT25seSE9Ik5BIikKIyAKIyByZWdfdHJhbnNwbyA9IGxtKAojICAgbG9nKHBsYXllci5wcmljZSkgfiBwbGF5ZXJOdW0gKyBsb2cocGxheWVyLnRyYW5zcG9ydF9jb3N0KSArIHBsYXllck51bTpsb2cocGxheWVyLnRyYW5zcG9ydF9jb3N0KSArZmFjdG9yKHBsYXllci5wZXJpb2RfbnVtYmVyKSArZmFjdG9yKHNlc3Npb24uY29kZSksCiMgICBkYXRhID0gVHJhbnNwb1JlZwojICkKIyAKIyByZWdfdHJhbnNwbyA9IGxtKAojICAgbG9nKHBsYXllci5wcmljZSkgfiBmYWN0b3IoZ3JvdXBfc2l6ZSkgKyBsb2cocGxheWVyLnRyYW5zcG9ydF9jb3N0KSArIGZhY3Rvcihncm91cF9zaXplKTpsb2cocGxheWVyLnRyYW5zcG9ydF9jb3N0KStmYWN0b3IocGxheWVyLnBlcmlvZF9udW1iZXIpICtmYWN0b3Ioc2Vzc2lvbi5jb2RlKS0xLAojICAgZGF0YSA9IFRyYW5zcG9SZWcgJT4lIG11dGF0ZShwbGF5ZXIucHJpY2UgPSBwbGF5ZXIucHJpY2UgKyAwLjAxKQojICkKIyAKIyBzdW1tYXJ5KHJlZ190cmFuc3BvKQpgYGAKClRoZXNlIHJlc3VsdHMgc3VnZ2VzdCB0aGF0IG5lZ2F0aXZlIChpbnNpZ25pZmljYW50KSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0cmFuc3BvcnQgY29zdHMgYW5kIHByaWNlcyBpbiAyIHBsYXllciBnYW1lLCBhbmQgcG9zaXRpdmUsIHNpZ25pZmljYW50LCByZWxhdGlvbnNoaXAgaW4gdGhlIDRwIGdhbWUuIFRoZXNlIGFyZSB0aGUgc2FtZSByZXN1bHRzIHdlIGhhZCBpbiB0aGUgcGlsb3Qgc3R1ZHkgbW9yZSBvciBsZXNzLiA=